package ch9;

import util.Debug;
import util.Tools;

import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 周期性任务的执行结果处理——使用该书作者实现的AsyncTask类
 *
 * 延迟执行的任务最多只会被执行一次，因此利用schedule方法的返回值（ScheduledFuture实例）可以获取到该计划任务的执行结果、
 * 执行过程中抛出的异常以及取消任务的执行
 *
 * 周期性执行的任务会不断地被执行，直到任务被取消或者相应地ScheduledExecutorService实例被关闭。
 * 该种任务无法通过返回值获取计划任务地一次或者多次地执行结果。
 */

public class PeriodicTaskResultHandlingDemo {
    final static ScheduledExecutorService ses = Executors.newScheduledThreadPool(2);

    public static void main(String[] args) {
        final String host = args[0];
        final AsyncTask<Integer> asyncTask = new AsyncTask<Integer>(ses) {
            final Random rnd = new Random();
            final String targetHost = host;

            @Override
            protected void onResult(Integer result) {
                // 将结果保存到数据库
                saveToDatabase(result);
            }

            private void saveToDatabase(Integer result) {
                Debug.info(targetHost + " status: " + String.valueOf(result));
                //...
            }

            @Override
            public String toString() {
                return "Ping " + targetHost + "," + super.toString();
            }

            @Override
            public Integer call() throws Exception {
                return pingHost();
            }

            private Integer pingHost() {
                // 模拟实际操作耗时
                Tools.randomPause(2000);
                // 模拟地探测结果码
                Integer r = Integer.valueOf(rnd.nextInt(4));
                return r;
            }
        };

        ses.scheduleAtFixedRate(asyncTask, 0, 3, TimeUnit.SECONDS);
    }
}
